
const redis = require('redis');
const redisOptions = require('./redisOptions');

const options = {
    host: redisOptions.host, // 服务器
    port: redisOptions.port, // 端口
    password: redisOptions.password, // 密码
    detect_buffers: redisOptions.detect_buffers, // 传入buffer 返回也是buffer 否则会转换成String
    retry_strategy: function (options) {
        // 重连机制
        if (options.error && options.error.code === "ECONNREFUSED") {
          // 在出现特定错误时结束重新连接，并刷新所有命令
          return new Error("The server refused the connection");
        }
        if (options.total_retry_time > 1000 * 60 * 60) {
          // 在特定超时后结束重新连接，并刷新所有命令
          return new Error("Retry time exhausted");
        }
        if (options.attempt > 10) {
          // 由于内部错误而结束重新连接
          return undefined;
        }
        // 重新连接
        return Math.min(options.attempt * 100, 3000);
    }
}
// 生成redis的client
const client = redis.createClient(options);

/**
 * 设置值,并设置过期时间
 * @param {String} key 键
 * @param {String} value 值(Object请使用JSON.stringify()包裹)
 * @param {Number} expire 过期时间(单位: 秒)
 */
const setValue = (key, value, expire) => {
    if (typeof value === 'string') {
        client.set(key, value);
    } else if (typeof value === 'object') {
        for (let item in value) {
            client.hmset(key, item, value[item], redis.print);
        };
    };
    client.expire(key, expire); // expire 过期时间(秒)
};


/**
 * 获取值
 * @param {String} key 键
 */
const getValue = (key) => {
    return new Promise((resolve, reject) => {
        client.get(key, (err, res) => {
            if (err) {
                reject(err);
            } else {
                resolve(res);
            };
        });
    });
};

/**
 * 删除
 * @param {String} key 键
 */
const deleteValue = (key) => {
    return new Promise((resolve, reject) => {
        client.del(key, (err, res) => {
            if (err) {
                reject(err);
            } else {
                resolve(res);
            };
        });
    });
};


// 数值自增
const incrValue = (key, value) => {
    client.incr(key, value);
};
   
// 获取hash
const getHValue = (key) => {
    return new Promise((resolve, reject) => {
        client.hgetall(key, function (err, value) {
            if (err) {
                reject(err);
            } else {
                resolve(value);
            };
        });
    });
};

// 导出
module.exports = {
    setValue,
    getValue,
    deleteValue,
    incrValue,
    getHValue
}